# Event serialization
The default serialization of event data and metadata uses Erlang's [external term format](http://erlang.org/doc/apps/erts/erl_ext_dist.html). This is not a recommended serialization format for production usage as backwards compatibility is only guaranteed going back at least two major releases.
You must implement the `EventStore.Serializer` behaviour to provide your preferred serialization format.
## JSON serialization using Jason
EventStore includes a JSON serializer using Jason in the `EventStore.JsonSerializer` module. To include it, add `{:jason, "~> 1.1"}` to your application's mix dependencies and configure your EventStore as below.
```elixir
config :eventstore, MyApp.EventStore, serializer: EventStore.JsonSerializer
```
## Example JSON serializer using Poison
The example serializer below serializes event data and metadata to JSON using the [Poison](https://github.com/devinus/poison) library.
```elixir
defmodule JsonSerializer do
@moduledoc """
A serializer that uses the JSON format.
"""
@behaviour EventStore.Serializer
@doc """
Serialize given term to JSON binary data.
"""
def serialize(term) do
Poison.encode!(term)
end
@doc """
Deserialize given JSON binary data to the expected type.
"""
def deserialize(binary, config) do
type = case Keyword.get(config, :type, nil) do
nil -> []
type -> type |> String.to_existing_atom |> struct
end
Poison.decode!(binary, as: type)
end
end
```
Configure the JSON serializer for your event store by setting the `serializer` option in the mix environment configuration file (e.g. `config/dev.exs`):
```elixir
config :eventstore, MyApp.EventStore, serializer: JsonSerializer
```
You must set the `event_type` field to a string representing the type of event being persisted when using this serializer:
```elixir
%EventStore.EventData{
event_type: "Elixir.ExampleEvent",
data: %ExampleEvent{key: "value"},
metadata: %{user: "someuser@example.com"},
}
```
You can use `Atom.to_string/1` to get a string representation of a given event struct compatible with the example `JsonSerializer` module:
```elixir
event = %ExampleEvent{key: "value"}
event_type = Atom.to_string(event.__struct__) #=> "Elixir.ExampleEvent"
```